import datetime
import os.path
import cap as cp
import face1
import cv2 as cv
from Controller import Controller

"""
在使用前必须确保数据库已经打开，并且在Database.py文件中对数据库登陆信息进行配置
我提供的这几个文件需要放在文件夹中，然后在这个文件夹外额外创建两个文件夹，images，和trains
使用时直接导入chen_util这个包就可以了
"""

"""
def add_one(name, identity)
参数：String name, int identity
name表示被添加的人的姓名,尽量保证name为英文, identity表示这个人的身份，0表示是普通员工，1表示是管理员 
使用时需要确保摄像头已经开启，手动按键盘上s30次来拍摄照片
异常：如果添加的人已经存在，则会抛出ChenXiException，这是我自定义的异常，注意对这个异常进行捕获，然后
客户端需要对此做出反应
"""


def add_one(name, identity):
    id1 = Controller.get_next_id()
    p = face1.get_face_info(name)
    face1.tran_image(p, id1)
    Controller.add_one(id1, name, identity)


"""
def verify()
调用时将自动从摄像头前拍摄一张照片，然后进行验证
返回值类型为 Bool String int，
Bool值表示验证是否成功，String 是对应的人名，int 是对应的身份标志
如果验证成功，String将是对应的人名，int将是0或1（0表示员工，1表示管理员）
如果验证失败，String将是空，int将是-1
"""


def verify():
    cap = cp.cap
    flag, image = cap.read()
    success, id_num = face1.verify1(image)
    if success:
        info = Controller.get_info_by_id(id_num)
        return True, info[0][1], info[0][2]
    else:
        return False, "", -1


"""
def delete_one(name)
根据姓名删除一个人
异常：如果试图删除一个不存在与数据库中的值，将会抛出ChenXiException异常，
注意对这个异常进行捕获，然后客户端做出响应
"""


def delete_one(name):
    ids = Controller.get_id_by_name(name)
    # 此处可能会抛出异常
    Controller.delete_one(name)
    # 如果程序执行到了这并没有结束，则说明上面的名字是合法的
    id_num = ids[0][0]
    # 然后是删除train里的训练数据
    path = '../trains/' + str(id_num)
    exists = os.path.exists(path)
    if exists:
        os.remove(path)


"""
def add_sign(name)
某人进行签到，这个函数可以应用在对用户进行验证后，如果验证成功便可以通过这一条进行签到
"""


def add_sign(name):
    Controller.add_sign(name)


"""
def get_names_from_time(start, end)
start 和 end 是 datatime.datetime 类，使用时提供开始时间和结束时间就
可以获得这一时间段内签到的名单，返回值可能时一个空元组，
如果非空,则这个元组的是由元组组成，其中的每一个小元组由 （签到人，签到时间）这两个元素组成
"""


def get_names_from_time(start, end):
    return Controller.get_names_from_time(start, end)


"""
def get_all_user_information():
这个函数将返回此时数据库中存储的所有用户信息
"""


def get_all_user_information():
    return Controller.get_all_user_information()
